﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using middleware.utiles;
using System.Globalization;

namespace middleware.consultaMensajesBandejaEntrada
{
    public class ConsultaMensajesBandejaEntrada : IConsulta
    {
        private string consultaSql = "";

        private string nombreConsulta = "";

        private string groubBy = " new(bandejaEntrada, bandejaEntrada.nombre, bandejaEntrada.nombreTipoBandeja)~bandejaEntrada.nombre";

        private string[] nombresFiltros = {"",""};

        private string[] filtros = null;

        private string[] cabezal = { "", "" };

        public ConsultaMensajesBandejaEntrada()
        {
            this.consultaSql = @"select new (KEY.bandejaEntrada.nombre as nombreBandeja, KEY.bandejaEntrada.nombreTipoBandeja as tipoBandeja, count() as cant) from Historico";
            this.nombreConsulta = "Consulta Mensajes Bandeja Entrada por Periodo";
            this.nombresFiltros = new string[] {"Periodo Inicio","Periodo Fin"};
            this.filtros = new string[] { "", "" };
            this.cabezal = new string[] { "Bandeja de Entrada", "Tipo de Bandeja", "Cantidad" };
        }

        override
        public string ToString()
        {
            return this.nombreConsulta;
        }

        public string ObtenerConsulta()
        {
            string resultado = consultaSql;

            if (this.filtros != null && this.filtros.Length > 0)
            {
                string strWhere = "";

                if (!String.IsNullOrEmpty(this.filtros[0]) && !String.IsNullOrEmpty(this.filtros[1]))
                {
                    DateTime fechaInicio = DateTime.ParseExact(this.filtros[0], "dd/MM/yyyy", CultureInfo.InvariantCulture);
                    DateTime fechaFin = DateTime.ParseExact(this.filtros[1], "dd/MM/yyyy", CultureInfo.InvariantCulture);
                    strWhere = strWhere + "(((Fecha.Year == " + fechaInicio.Year + ") and (Fecha.Month == " + fechaInicio.Month + ") and (Fecha.Day >= " + fechaInicio.Day + ")) or " 
                                                        + "((Fecha.Year == " + fechaInicio.Year + ") and (Fecha.Month > " + fechaInicio.Month + ")) or" 
                                                        + "(Fecha.Year > " + fechaInicio.Year + ")) and " 
                                        + "(((Fecha.Year == " + fechaFin.Year + ") and (Fecha.Month == " + fechaFin.Month + ") and (Fecha.Day <= " + fechaFin.Day + ")) or " 
                                                        + "((Fecha.Year == " + fechaFin.Year + ") and (Fecha.Month < " + fechaFin.Month + ")) or " 
                                                        + "(Fecha.Year < " + fechaFin.Year + "))";

                    resultado = resultado + " where " + strWhere;
                }                
            }

            resultado = resultado + " groupby " + groubBy;

            return resultado;
        }

        public void AgregarFiltros(string[] filtros)
        {
            this.filtros = filtros;
        }

        public string[] ObtenerNombresFiltros()
        {
            return nombresFiltros;
        }

        public string[] ObtenerCabezal()
        {
            return this.cabezal;
        }
    }
}
